/**
 * 日期辅助函数模块
 * 提供日期格式化、解析等通用函数
 */

/**
 * 格式化时间
 * @param {string} format 格式模板，如：Y-M-D h:m:s
 * @param {Date|number} timestamp 日期对象或时间戳，默认当前时间
 * @returns {string} 格式化后的时间字符串
 */
function time(format = 'Y-M-D h:m:s', timestamp = null) {
  const date = timestamp ? (typeof timestamp === 'object' ? timestamp : new Date(timestamp)) : new Date();
  
  const formatObj = {
    Y: date.getFullYear(),
    M: date.getMonth() + 1,
    D: date.getDate(),
    h: date.getHours(),
    m: date.getMinutes(),
    s: date.getSeconds()
  };
  
  return format.replace(/(Y|M|D|h|m|s)/g, match => {
    const value = formatObj[match];
    return value < 10 ? '0' + value : value;
  });
}

/**
 * 获取当前时间戳
 * @param {boolean} inSeconds 是否返回秒级时间戳，默认毫秒级
 * @returns {number} 时间戳
 */
function timestamp(inSeconds = false) {
  const ts = Date.now();
  return inSeconds ? Math.floor(ts / 1000) : ts;
}

/**
 * 将日期字符串转为时间戳
 * @param {string} dateStr 日期字符串
 * @param {boolean} inSeconds 是否返回秒级时间戳，默认毫秒级
 * @returns {number} 时间戳
 */
function strToTimestamp(dateStr, inSeconds = false) {
  if (!dateStr) return null;
  const ts = new Date(dateStr).getTime();
  return inSeconds ? Math.floor(ts / 1000) : ts;
}

/**
 * 格式化为友好的时间显示
 * @param {Date|number|string} date 日期对象、时间戳或日期字符串
 * @returns {string} 友好的时间字符串
 */
function friendlyTime(date) {
  if (!date) return '';
  
  const now = new Date();
  const targetDate = typeof date === 'object' ? date : new Date(date);
  const diff = Math.floor((now.getTime() - targetDate.getTime()) / 1000);
  
  if (diff < 60) {
    return '刚刚';
  } else if (diff < 3600) {
    return Math.floor(diff / 60) + '分钟前';
  } else if (diff < 86400) {
    return Math.floor(diff / 3600) + '小时前';
  } else if (diff < 2592000) {
    return Math.floor(diff / 86400) + '天前';
  } else {
    return time('Y-M-D', targetDate);
  }
}

/**
 * 获取两个日期之间的天数差
 * @param {Date|number|string} date1 日期1
 * @param {Date|number|string} date2 日期2，默认当前日期
 * @returns {number} 天数差
 */
function daysBetween(date1, date2 = null) {
  const d1 = typeof date1 === 'object' ? date1 : new Date(date1);
  const d2 = date2 ? (typeof date2 === 'object' ? date2 : new Date(date2)) : new Date();
  
  const diffTime = Math.abs(d2.getTime() - d1.getTime());
  const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
  
  return diffDays;
}

/**
 * 判断是否为同一天
 * @param {Date|number|string} date1 日期1
 * @param {Date|number|string} date2 日期2，默认当前日期
 * @returns {boolean} 是否为同一天
 */
function isSameDay(date1, date2 = null) {
  const d1 = typeof date1 === 'object' ? date1 : new Date(date1);
  const d2 = date2 ? (typeof date2 === 'object' ? date2 : new Date(date2)) : new Date();
  
  return d1.getFullYear() === d2.getFullYear() && 
         d1.getMonth() === d2.getMonth() && 
         d1.getDate() === d2.getDate();
}

// 导出模块
module.exports = {
  time,
  timestamp,
  strToTimestamp,
  friendlyTime,
  daysBetween,
  isSameDay
}; 